using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._3DFeatures._Conversion
{
    /// <summary>
    /// <para>Import 3D Files</para>
    /// <para>Imports one or more 3D models into a multipatch feature class.</para>
    /// <para>将一个或多个 3D 模型导入到多面体要素类中。</para>
    /// </summary>    
    [DisplayName("Import 3D Files")]
    public class Import3DFiles : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Import3DFiles()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_files">
        /// <para>Input Files</para>
        /// <para>One or more 3D models or folders containing such files in the supported formats, which are 3D Studio Max (*.3ds), VRML and GeoVRML (*.wrl), OpenFlight (*.flt), COLLADA (*.dae), and Wavefront OBJ models (*.obj).</para>
        /// <para>一个或多个 3D 模型或文件夹，其中包含支持格式的此类文件，包括 3D Studio Max （*.3ds）、VRML 和 GeoVRML （*.wrl）、OpenFlight （*.flt）、COLLADA （*.dae） 和 Wavefront OBJ 模型 （*.obj）。</para>
        /// </param>
        /// <param name="_out_featureClass">
        /// <para>Output Multipatch Feature Class</para>
        /// <para>The multipatch that will be created from the input files.</para>
        /// <para>将从输入文件创建的多面体。</para>
        /// </param>
        public Import3DFiles(List<object> _in_files, object _out_featureClass)
        {
            this._in_files = _in_files;
            this._out_featureClass = _out_featureClass;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Import 3D Files";

        public override string CallName => "3d.Import3DFiles";

        public override List<string> AcceptEnvironments => ["XYDomain", "ZDomain", "autoCommit", "configKeyword", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_in_files, _out_featureClass, _root_per_feature.GetGPValue(), _spatial_reference, _y_is_up.GetGPValue(), _file_suffix.GetGPValue(), _in_featureClass, _symbol_field];

        /// <summary>
        /// <para>Input Files</para>
        /// <para>One or more 3D models or folders containing such files in the supported formats, which are 3D Studio Max (*.3ds), VRML and GeoVRML (*.wrl), OpenFlight (*.flt), COLLADA (*.dae), and Wavefront OBJ models (*.obj).</para>
        /// <para>一个或多个 3D 模型或文件夹，其中包含支持格式的此类文件，包括 3D Studio Max （*.3ds）、VRML 和 GeoVRML （*.wrl）、OpenFlight （*.flt）、COLLADA （*.dae） 和 Wavefront OBJ 模型 （*.obj）。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Files")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _in_files { get; set; }


        /// <summary>
        /// <para>Output Multipatch Feature Class</para>
        /// <para>The multipatch that will be created from the input files.</para>
        /// <para>将从输入文件创建的多面体。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Multipatch Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_featureClass { get; set; }


        /// <summary>
        /// <para>One Root Per Feature</para>
        /// <para><xdoc>
        ///   <para>Indicates whether to produce one feature per file or one feature for every root node in the file. This option only applies to VRML models.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—The generated output will contain one file for each feature. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—The generated output will contain one feature for each root node in the file.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指示是为每个文件生成一个功能，还是为文件中的每个根节点生成一个功能。此选项仅适用于 VRML 型号。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 生成的输出将包含每个要素的一个文件。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 - 生成的输出将包含文件中每个根节点的一个要素。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("One Root Per Feature")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _root_per_feature_value _root_per_feature { get; set; } = _root_per_feature_value._false;

        public enum _root_per_feature_value
        {
            /// <summary>
            /// <para>ONE_FILE_ONE_FEATURE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ONE_FILE_ONE_FEATURE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>ONE_ROOT_ONE_FEATURE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ONE_ROOT_ONE_FEATURE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Coordinate System</para>
        /// <para>The coordinate system of the input data. For the majority of formats, this is unknown. Only the GeoVRML format stores its coordinate system, and its default will be obtained from the first file in the list unless a spatial reference is specified here.</para>
        /// <para>输入数据的坐标系。对于大多数格式，这是未知的。只有 GeoVRML 格式存储其坐标系，除非在此处指定空间参考，否则将从列表中的第一个文件获取其默认值。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _spatial_reference { get; set; } = null;


        /// <summary>
        /// <para>Y Is Up</para>
        /// <para><xdoc>
        ///   <para>Identifies the axis that defines the vertical orientation of the input files.</para>
        ///   <bulletList>
        ///     <bullet_item>Unchecked—Indicates that z is up. This is the default.</bullet_item><para/>
        ///     <bullet_item>Checked—Indicates that y is up.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>标识定义输入文件垂直方向的轴。</para>
        ///   <bulletList>
        ///     <bullet_item>未选中 - 指示 z 已向上。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>选中 （Checked） - 指示 y 已启动。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Y Is Up")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _y_is_up_value _y_is_up { get; set; } = _y_is_up_value._false;

        public enum _y_is_up_value
        {
            /// <summary>
            /// <para>Y_IS_UP</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Y_IS_UP")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>Z_IS_UP</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Z_IS_UP")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>File Suffix</para>
        /// <para><xdoc>
        ///   <para>The file extension of the files to import from an input folder. This parameter is required when at least one folder is specified as an input.</para>
        ///   <bulletList>
        ///     <bullet_item>All Supported Files—All supported files. This is the default.</bullet_item><para/>
        ///     <bullet_item>3D Studio Max (*.3ds)—3D Studio Max</bullet_item><para/>
        ///     <bullet_item>VRML or GeoVRML (*.wrl)—VRML or GeoVRML</bullet_item><para/>
        ///     <bullet_item>OpenFlight (*.flt)—OpenFlight</bullet_item><para/>
        ///     <bullet_item>Collada (*.dae)—Collada</bullet_item><para/>
        ///     <bullet_item>Wavefront OBJ format (*.obj)—Wavefront OBJ model</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要从输入文件夹导入的文件的文件扩展名。当至少指定一个文件夹作为输入时，此参数是必需的。</para>
        ///   <bulletList>
        ///     <bullet_item>所有支持的文件 - 所有支持的文件。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>3D Studio Max （*.3ds） - 3D Studio Max</bullet_item><para/>
        ///     <bullet_item>VRML 或 GeoVRML （*.wrl） - VRML 或 GeoVRML</bullet_item><para/>
        ///     <bullet_item>OpenFlight （*.flt） - OpenFlight</bullet_item><para/>
        ///     <bullet_item>Collada （*.dae） - Collada</bullet_item><para/>
        ///     <bullet_item>波前 OBJ 格式 （*.obj） - 波前 OBJ 模型</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("File Suffix")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _file_suffix_value _file_suffix { get; set; } = _file_suffix_value.value5;

        public enum _file_suffix_value
        {
            /// <summary>
            /// <para>3D Studio Max (*.3ds)</para>
            /// <para>3D Studio Max (*.3ds)—3D Studio Max</para>
            /// <para>3D Studio Max （*.3ds） - 3D Studio Max</para>
            /// </summary>
            [Description("3D Studio Max (*.3ds)")]
            [GPEnumValue("3DS")]
            _3DS,

            /// <summary>
            /// <para>VRML or GeoVRML (*.wrl)</para>
            /// <para>VRML or GeoVRML (*.wrl)—VRML or GeoVRML</para>
            /// <para>VRML 或 GeoVRML （*.wrl） - VRML 或 GeoVRML</para>
            /// </summary>
            [Description("VRML or GeoVRML (*.wrl)")]
            [GPEnumValue("WRL")]
            _WRL,

            /// <summary>
            /// <para>OpenFlight (*.flt)</para>
            /// <para>OpenFlight (*.flt)—OpenFlight</para>
            /// <para>OpenFlight （*.flt） - OpenFlight</para>
            /// </summary>
            [Description("OpenFlight (*.flt)")]
            [GPEnumValue("FLT")]
            _FLT,

            /// <summary>
            /// <para>Collada (*.dae)</para>
            /// <para>Collada (*.dae)—Collada</para>
            /// <para>Collada （*.dae） - Collada</para>
            /// </summary>
            [Description("Collada (*.dae)")]
            [GPEnumValue("DAE")]
            _DAE,

            /// <summary>
            /// <para>Wavefront OBJ format (*.obj)</para>
            /// <para>Wavefront OBJ format (*.obj)—Wavefront OBJ model</para>
            /// <para>波前 OBJ 格式 （*.obj） - 波前 OBJ 模型</para>
            /// </summary>
            [Description("Wavefront OBJ format (*.obj)")]
            [GPEnumValue("OBJ")]
            _OBJ,

            /// <summary>
            /// <para>All Supported Files</para>
            /// <para>All Supported Files—All supported files. This is the default.</para>
            /// <para>所有支持的文件 - 所有支持的文件。这是默认设置。</para>
            /// </summary>
            [Description("All Supported Files")]
            [GPEnumValue("*")]
            value5,

        }

        /// <summary>
        /// <para>Placement Points</para>
        /// <para>The point features whose coordinates define the real-world position of the input files. Each input file will be matched to its corresponding point based on the file names stored in the Symbol Field. The Coordinate System parameter should be defined to match the spatial reference of the points.</para>
        /// <para>其坐标定义输入文件的实际位置的点要素。每个输入文件将根据存储在符号字段中的文件名与其对应点进行匹配。应定义坐标系参数以匹配点的空间参考。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Placement Points")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_featureClass { get; set; } = null;


        /// <summary>
        /// <para>Symbol Field</para>
        /// <para>The field in the point features containing the name of the 3D file associated with each point.</para>
        /// <para>点要素中的字段包含与每个点关联的 3D 文件的名称。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Symbol Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _symbol_field { get; set; } = null;


        public Import3DFiles SetEnv(object XYDomain = null, object ZDomain = null, int? autoCommit = null, object configKeyword = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, ZDomain: ZDomain, autoCommit: autoCommit, configKeyword: configKeyword, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}